/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.edu.pucp.DAO;

import pe.edu.pucp.bean.Contenedor;
import pe.edu.pucp.bean.NoRefrigerado;
import pe.edu.pucp.bean.Refrigerado;
import java.util.ArrayList;
import java.sql.*;
import javax.swing.JOptionPane;
import pe.edu.pucp.views.*;

public class MSAccessDAOContenedor implements DAOContenedor {

    @Override
    public ArrayList<Contenedor> queryAllContenedor() {
            ArrayList <Contenedor> contenedorList = new ArrayList<Contenedor>();
            Connection conn = null;
            PreparedStatement pstmt = null;
            PreparedStatement pstmt2=null;
            PreparedStatement pstmt3=null;
            ResultSet rs = null;
            ResultSet rs2=null;
            ResultSet rs3=null;
            try{
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
                pstmt = conn.prepareStatement("SELECT * FROM CONTENEDOR");
                rs =  pstmt.executeQuery();
                //4. Se evalúan los resultados
                while (rs.next()){
                        String id = rs.getString("IDCONTENEDOR");
                        float peso_neto = rs.getFloat("PESO_NETO");
                        float peso_bruto = rs.getFloat("PESO_BRUTO");
                        float volumen = rs.getFloat("VOLUMEN");
                        String desc=rs.getString("DESCRIPCION");
                        float tara = rs.getFloat("TARA");
                                           
                        String tipoC= rs.getString("TIPO");
                        //Contenedor cont= null;
                     //   cont = new Contenedor(id,peso_neto,peso_bruto,volumen,desc,tara,tipoC);
                                           
                    if (tipoC.equalsIgnoreCase("R")) {
                        pstmt2 = conn.prepareStatement("SELECT TEMPERATURA, MOTOR FROM REFRIGERADO "
                                + " where REFRIGERADO.IDCONTENEDOR='"+ id + "'");
                        rs2 = pstmt2.executeQuery();
                        if (rs2.next()) {
                            float temperatura = rs2.getFloat("TEMPERATURA");
                            String motor = rs2.getString("MOTOR");
                            Contenedor cont = new Refrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoC, motor, temperatura);
                            contenedorList.add(cont);
                        }
                        rs2.close();
                    } else {
                        pstmt3 = conn.prepareStatement("SELECT TIPO_CONTENIDO, ESTADO FROM NO_REFRIGERADO "
                                 +" where NO_REFRIGERADO.IDCONTENEDOR='"+ id + "'");
                    rs3 =  pstmt3.executeQuery();
                     if (rs3.next()){
                    String tipoContenido = rs3.getString("TIPO_CONTENIDO");
                    String estado = rs3.getString("ESTADO");
                    Contenedor cont = new NoRefrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoContenido, tipoContenido, estado);
                     contenedorList.add(cont);
                     }
                     rs3.close();
                    }
                   //contenedorList.add(cont);
            }



            }catch(Exception ex){
                ex.printStackTrace();
            }finally{
                 //5. Se cierra la conexión
                try {if (rs != null) rs.close(); }
                 catch(Exception e){
                     e.printStackTrace();
                 }
            }
            
        return contenedorList;
    }

    @Override
    public int insertCont(Contenedor cont) {
        int result =0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2= null;
        ResultSet rs = null;

        try {
            //1. Se registra el driver de la BD
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
          
            String SQLString = null;
            String SQLString2 = null;
            SQLString =
                    "INSERT INTO CONTENEDOR(IDCONTENEDOR,PESO_NETO,PESO_BRUTO,VOLUMEN,DESCRIPCION,TARA,TIPO) "
                    + "VALUES(?,?,?,?,?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setString(1, cont.getId());
                pstmt.setFloat(2, cont.getPeso_neto());
                pstmt.setFloat(3, cont.getPeso_bruto());
                pstmt.setFloat(4, cont.getVolumen());
                pstmt.setString(5, cont.getDescripcionMerc());
                pstmt.setFloat(6, cont.getTara());
                pstmt.setString(7, cont.getTipoContenedor());

                result =  pstmt.executeUpdate();
            if (cont instanceof Refrigerado){

                SQLString = "INSERT INTO REFRIGERADO(IDCONTENEDOR,TEMPERATURA,MOTOR) "
                        + "VALUES(?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setString(1, cont.getId());
                pstmt.setFloat(2, ((Refrigerado)cont).getTemperatura());
                pstmt.setString(3, ((Refrigerado)cont).getMotor());
                

            } else if (cont instanceof NoRefrigerado){

                SQLString = "INSERT INTO NO_REFRIGERADO(IDCONTENEDOR,TIPO_CONTENIDO,ESTADO) "
                        + "VALUES(?,?,?)";
                pstmt = conn.prepareStatement(SQLString);
                pstmt.setString(1, cont.getId());
                pstmt.setString(2, ((NoRefrigerado)cont).getTipoContenido());
                pstmt.setString(3, ((NoRefrigerado)cont).getEstado());
                //result =  pstmt.executeUpdate();
            }
                    
            result =  pstmt.executeUpdate();

            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }
        } catch (Exception ex) {
            //ex.printStackTrace();
        } finally {
             cont.setId("1");
             //5. Se cierra la conexión
             try {if (rs != null) {
                 
                 rs.close();
             } }
             catch(Exception e){e.printStackTrace();
           //  JOptionPane.showMessageDialog(null,"El ID del contenedor ya ha sido ingresado"," ",JOptionPane.ERROR_MESSAGE);

             }
        }

        return result;
    }

    @Override
    public int updateCont(Contenedor nuevoCont) {
        int result=0;
        Connection con = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
        String nid=nuevoCont.getId();
        float npeso_neto = nuevoCont.getPeso_neto();
        float npeso_bruto = nuevoCont.getPeso_neto();
        float nvolumen = nuevoCont.getVolumen();
        String ndesc=nuevoCont.getDescripcionMerc();
        float ntara =nuevoCont.getTara();
        String ntipoC;
        if (PanelContenedorAgregar.rbtnRef==1)  ntipoC="R";
        else if (PanelContenedorAgregar.rbtnNoRef==0) ntipoC="N";
        
        try{
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            con = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            
            String SQLString = null;
            SQLString ="UPDATE CONTENEDOR SET "+
                       "IDCONTENEDOR = '"+nid+
                       "',PESO_NETO = '"+npeso_neto+
                       "',PESO_BRUTO = '"+npeso_bruto+
                       "',VOLUMEN = '"+nvolumen+
                       "',DESCRIPCION = '"+ndesc+
                       "',TARA = '"+ntara+"'"+
                     //,TIPO = '"+ntipoC+"'"+
                       " WHERE IDCONTENEDOR = '"+nid+"'";
            
            pstmt = con.prepareStatement(SQLString);
            result =  pstmt.executeUpdate();
            
            if (nuevoCont instanceof Refrigerado){

                float ntemperatura = ((Refrigerado)nuevoCont).getTemperatura();
                String nmotor = ((Refrigerado)nuevoCont).getMotor();
                
                SQLString = "UPDATE REFRIGERADO SET " +
                         "TEMPERATURA = '"+ntemperatura+
                         "',MOTOR = '"+nmotor+"'"+
                         " WHERE IDCONTENEDOR = '"+nid+"'";
                
                
                pstmt = con.prepareStatement(SQLString);
                

            } else if (nuevoCont instanceof NoRefrigerado){

                String ntipoContenido  = ((NoRefrigerado)nuevoCont).getTipoContenido();
                String nestado = ((NoRefrigerado)nuevoCont).getEstado();
                
                    SQLString = "UPDATE NO_REFRIGERADO SET " +
                         "TIPO_CONTENIDO = '"+ntipoContenido+
                         "',ESTADO = '"+nestado+
                         " WHERE IDCONTENEDOR = '"+nid+"'";
                pstmt = con.prepareStatement(SQLString);
                
            }
            result =  pstmt.executeUpdate();
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }   
        }catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        }
        
        
        return result;
    }


    
    @Override
    public Contenedor queryByContenedor(String idbuscado) {
        
        int result =0;
        int esRefri=0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2 = null;
        PreparedStatement pstmt3 = null;
        ResultSet rs = null;
        ResultSet rs2 = null;
        ResultSet rs3 = null;
        Contenedor cont= null;
        
        try {
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            
            SQLString ="SELECT * FROM CONTENEDOR WHERE IDCONTENEDOR = '"+idbuscado+"'";
            pstmt = conn.prepareStatement(SQLString);      
            rs =  pstmt.executeQuery();
            
            while (rs.next()){
                String id = rs.getString("IDCONTENEDOR");
                float peso_neto = rs.getFloat("PESO_NETO");
                float peso_bruto = rs.getFloat("PESO_BRUTO");
                float volumen = rs.getFloat("VOLUMEN");
                String desc=rs.getString("DESCRIPCION");
                float tara = rs.getFloat("TARA");
                String tipoC= rs.getString("TIPO");
                
                
                if (tipoC.equalsIgnoreCase("R")){
                        esRefri=1;
                         pstmt2 = conn.prepareStatement("SELECT TEMPERATURA, MOTOR FROM REFRIGERADO "
                                 +" where REFRIGERADO.IDCONTENEDOR='"+ id + "'");
                         rs2 =  pstmt2.executeQuery();
                         if (rs2.next()){
                            float temperatura = rs2.getFloat("TEMPERATURA");
                            String motor = rs2.getString("MOTOR");
                            cont = new Refrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoC, motor, temperatura);
                         }
                         rs2.close();
                } else {
                    pstmt3 = conn.prepareStatement("SELECT TIPO_CONTENIDO, ESTADO FROM NO_REFRIGERADO "
                                 +" where NO_REFRIGERADO.IDCONTENEDOR='"+ id + "'");
                    rs3 =  pstmt3.executeQuery();
                     if (rs3.next()){
                    String tipoContenido = rs3.getString("TIPO_CONTENIDO");
                    String estado = rs3.getString("ESTADO");
                    cont = new NoRefrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoContenido, tipoContenido, estado);
                     }
                     rs3.close();
                    }
                
                
            }
            
            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return cont;
    }

    @Override
    public int insertContxDoc(String idDoc,String idCont) {
        
        int result =0;
         int idcontenedor=0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        PreparedStatement pstmt2 = null;
        ResultSet rs2 = null;
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
                   
            String SQLString = null;
            
            SQLString = "INSERT INTO DOCUMENTOXCONTENEDOR(IDDOCUMENTO,IDCONTENEDOR,FECHA)"
                        + "VALUES(?,?,?)";
            
            pstmt = conn.prepareStatement(SQLString);
            pstmt.setString(1,idDoc );
            pstmt.setString(2,String.valueOf(idcontenedor));
            pstmt.setString(3,null);
            
            result =  pstmt.executeUpdate();
            
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        return result;
    }

    @Override
    public ArrayList<Contenedor> queryAllContxDoc(String idDoc) {
        
        ArrayList <Contenedor> contenedorList = new ArrayList<Contenedor>();
            
            Connection conn = null;
            PreparedStatement pstmt = null;
            PreparedStatement pstmt2=null;
            PreparedStatement pstmt3=null;
            ResultSet rs = null;
            ResultSet rs2=null;
            ResultSet rs3=null;
            
            try{
              Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
                pstmt = conn.prepareStatement("SELECT c.idcontenedor,c.peso_neto,c.peso_bruto,c.volumen,c.descripcion,c.tara,c.tipo "
                                             +" FROM CONTENEDOR c ,DOCUMENTOXCONTENEDOR dxc "
                                             +" WHERE  dxc.IDDOCUMENTO='"+ idDoc + "' AND c.IDCONTENEDOR=dxc.IDCONTENEDOR");
                rs =  pstmt.executeQuery();
                
                while (rs.next()){
                        String id = rs.getString("IDCONTENEDOR");
                        float peso_neto = rs.getFloat("PESO_NETO");
                        float peso_bruto = rs.getFloat("PESO_BRUTO");
                        float volumen = rs.getFloat("VOLUMEN");
                        String desc=rs.getString("DESCRIPCION");
                        float tara = rs.getFloat("TARA");
                        String tipoC= rs.getString("TIPO");
                        Contenedor cont= null;
                     //   cont = new Contenedor(id,peso_neto,peso_bruto,volumen,desc,tara,tipoC);
                    if (tipoC.equalsIgnoreCase("R")) {
                        pstmt2 = conn.prepareStatement("SELECT TEMPERATURA, MOTOR FROM REFRIGERADO "
                                + " where REFRIGERADO.IDCONTENEDOR='"+ id + "'");
                        rs2 = pstmt2.executeQuery();
                        if (rs2.next()) {
                            float temperatura = rs2.getFloat("TEMPERATURA");
                            String motor = rs2.getString("MOTOR");
                            cont = new Refrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoC, motor, temperatura);
                        }
                        rs2.close();
                    } else {
                        pstmt3 = conn.prepareStatement("SELECT TIPO_CONTENIDO, ESTADO FROM NO_REFRIGERADO "
                                 +" where NO_REFRIGERADO.IDCONTENEDOR='"+ id + "'");
                    rs3 =  pstmt3.executeQuery();
                     if (rs3.next()){
                    String tipoContenido = rs3.getString("TIPO_CONTENIDO");
                    String estado = rs3.getString("ESTADO");
                    cont = new NoRefrigerado(id, peso_neto, peso_bruto, volumen, desc, tara, tipoContenido, tipoContenido, estado);
                     }
                     rs3.close();
                    }
                   contenedorList.add(cont);
            }



            }catch(Exception ex){
                ex.printStackTrace();
            }finally{
                 //5. Se cierra la conexión
                try {if (rs != null) rs.close(); }
                 catch(Exception e){
                     e.printStackTrace();
                 }
            }
            
        return contenedorList;        
    }

    @Override
    public int deleteCont(String id) {
        int result=0;
        Connection conn = null;
        PreparedStatement pstmt = null;
        PreparedStatement pstmt2=null;
        PreparedStatement pstmt3=null;
          PreparedStatement pstmt4=null;
        ResultSet rs = null;
        
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            String SQLString2=null;
            String SQLString3=null;
            //Se prepara la sentencia SQL
            
            SQLString ="DELETE FROM NO_REFRIGERADO"+" WHERE IDCONTENEDOR = '"+ id + "'";
            SQLString2="DELETE FROM REFRIGERADO"+" WHERE IDCONTENEDOR = '"+ id + "'";
            String SQLString4= "DELETE FROM DocumentoxContenedor"+" WHERE IDCONTENEDOR = '"+ id + "'";
            SQLString3="DELETE FROM CONTENEDOR"+" WHERE IDCONTENEDOR = '"+ id + "'";
            
            pstmt = conn.prepareStatement(SQLString);
            result =  pstmt.executeUpdate();
            
            pstmt2=conn.prepareStatement(SQLString2);
            result =  pstmt2.executeUpdate();
            
           
            
            pstmt4=conn.prepareStatement(SQLString4);
            result =  pstmt4.executeUpdate();
            
             pstmt3=conn.prepareStatement(SQLString3);
            result =  pstmt3.executeUpdate();
            
            
            //4. Se evalúan los resultados
            if (result == 0){
                throw new Exception();
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
        
        
        return result;
        
    }

    @Override
    public ArrayList<Contenedor> querybycampos(String id, String desc) {
        ArrayList <Contenedor> userList = new ArrayList<Contenedor>();
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;
        
            try {
            //1. Se registra el driver de la BD
             Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            //2. Se abre la conexión
            String connectionUrl="jdbc:odbc:Tramarsa";
            conn = DriverManager.getConnection(connectionUrl);
            //3. Se ejecuta la sentencia SQL
            String SQLString = null;
            SQLString ="SELECT * FROM CONTENEDOR WHERE IDCONTENEDOR LIKE'%"+id+"%' and DESCRIPCION LIKE '%"+desc+"%'"; 
            
          
            
            
            pstmt = conn.prepareStatement(SQLString );
            rs =  pstmt.executeQuery();
            
            //4. Se evalúan los resultados
            while (rs.next()){
                String cod = rs.getString("IDCONTENEDOR");
                Float pn = Float.parseFloat(rs.getString("PESO_NETO"));
                Float pb = Float.parseFloat(rs.getString("PESO_BRUTO"));
                Float vol =Float.parseFloat(rs.getString("VOLUMEN"));
                String descr = rs.getString("DESCRIPCION");
                Float tara=Float.parseFloat(rs.getString("TARA"));
                String tipo=rs.getString("TIPO");
                
                Contenedor c = new Contenedor(cod,pn,pb,vol,descr,tara,tipo);
                userList.add(c);
            }            
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
             //5. Se cierra la conexión
             try {if (rs != null) rs.close(); } 
             catch(Exception e){e.printStackTrace();}  
        } 
            return userList; 
    }

   
}
